\chapter{分叉 \& 分支}


\section{简介}

这个章节将会覆盖Fossil的分叉和分支。 分叉是你非故意创建的二个检入仓库的不同源码版本。分支(Branching)是你刻意创建的，因为你想要在同一个仓库里维护二个或者更多的源码版本。我在章节\vref{sub:Complications}里提到了分叉（Forking）及其使用方案。如果，不修复（合并）直接提交，且强制提交后，Fossil将会自动在仓库里创建一个分叉（Forking）。

分支（Forking）通过创个二个检入（checkin）的路径来避免冲突，因此不同的用户将会在不同的路径上工作且可以检入相互矛盾的变更。而分支（Branch）却是你所期待的另一个选择。当你想要拥有二个基于不同源码的不同版本同时进行工作时可以使用分支（Branching）。如在章节\vref{versioning}所描述的，当你期望在同一个仓库里有一个生产版本用于维护一个开发版本用于生产，这样的话生产的变更只会被检入到开发分支（Branching)，维护的修改可能都会被检入到上述二个版本。

这里我们不用这本的仓库作为示例，而是用有大量文件盒文档的JSON\cite{JSON}语法程序作为例子。这样来阐述Branching和Tagging会变得简单一些。

在Fossil网站上有一个比较好的帖子可以参考\url{http://www.fossil-scm.org/index.html/doc/tip/www/branching.wiki}。


\section{分叉，分支\& 合并}

在这个例子里，JSON代码已经添加到了Fossil且有二个开发人员已经检出了代码并且开始了他们各自的工作。Jim想要修复修复大量的编译警告而Marilyn想要修改文档。他们所做的操作流程乐意参考章节\vref{sec:Multiple-Users}。JSON 的源代码分布在不同的位置，他们都克隆（clone）了仓库，且打开了代码的工作拷贝。


\subsection{Marilyn的操作}

她检阅了文档并发现大量的问题并修正了这些问题（文档使用的是\LyX{}和PDF格式）。当她对她所完成的时间感觉很满意后，她将她的修正版本检入到了如下所示的地方：

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/Simple_Merge/sm_Marilyn}

\caption{\label{fig:Marilyn's-work}Marilyn的工作}
\end{figure}



\subsection{Jim的操作}

同时，Jim获取了版本{[}6edbaf5fa8{]}的源码副本，并如\ref{fig:Marilyn's-work}章节加入了一个标签（ticket）{[}d23bf4bbbb{]}。在完成了修复警告的问题后，Jim完成并进行了提交。他做这些是在Marilyn完成她的提交之后。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize 551~jsonp>~}\textbf{\footnotesize fossil~commit~-m~\textquotedbl{}{[}d23bf4bbbb{]}~Remove~warnings\textquotedbl{}}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~~874~~~~~~~~~19~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~339~bytes~sent,~771~bytes~received}{\footnotesize \par}

{\footnotesize fossil:~would~fork.~~\textquotedbl{}update\textquotedbl{}~first~or~use~-f~or~-{}-force.}{\footnotesize \par}

{\footnotesize 552~jsonp>~}{\footnotesize \par}
\end{lyxcode}
\caption{Jim的提交意图}


\end{figure}


这时Fossil意识到Marilyn已经修改了仓库（她更新了文档）但是Jim却没有这些修订的内容，因为Jim检入的是一个更早版本的源码。Jim认为他\textbf{必须}获取更新，所以他使用FORCE参数强制进行了提交。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize 552~jsonp>~}\textbf{\footnotesize fossil}{\footnotesize{}~}\textbf{\footnotesize commit~-m~\textquotedbl{}{[}d23bf4bbbb{]}~Remove~warnings\textquotedbl{}~-f}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~~874~~~~~~~~~19~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~338~bytes~sent,~771~bytes~received}{\footnotesize \par}

{\footnotesize New\_Version:~1beab955418a942ab9953c4865109ff46cbbd691}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~2646~~~~~~~~~25~~~~~~~~~~0~~~~~~~~~~4}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1058~~~~~~~~~23~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~1498~bytes~sent,~864~bytes~received}{\footnotesize \par}

{\footnotesize {*}{*}{*}{*}~warning:~a~fork~has~occurred~{*}{*}{*}{*}{*}}{\footnotesize \par}
\end{lyxcode}
\caption{强制的提交}


\end{figure}


看看时间线，Jim看到如下内容：

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/Simple_Merge/sm_jim_fork}

\caption{仓库分叉Fork}


\end{figure}


不好，现在有两个\textbf{Leaf}， Marilyn可以将她的修改提交到她的Leaf，Jim也可以将修改提交到他自己的leaf。所以Jim必须通过合并来修复这个问题。Jim想将Marilyn的版本和他的版本{[}1beab85441{]}进行合并。


\subsection{修复分叉fork}

所以Jim从检出了分支Leaf{[}1beab85441{]}并且与Marilyn的分支leaf{[}b72e96832e{]}进行合并，操作如下：

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize 556~jsonp>~}\textbf{\footnotesize fossil~merge~b72e96832e}{\footnotesize \par}

{\footnotesize UPDATE~docs/qdj.lyx}{\footnotesize \par}

{\footnotesize UPDATE~docs/qdj.pdf}{\footnotesize \par}

{\footnotesize 557~jsonp>~}\textbf{\footnotesize fossil~status}{\footnotesize \par}

{\footnotesize repository:~~~/Users/jschimpf/Public/FOSSIL/jsonp.fossil}{\footnotesize \par}

{\footnotesize local-root:~~~/Users/jschimpf/Public/jsonp/}{\footnotesize \par}

{\footnotesize server-code:~~d3e7932b0b0f5e704264ba30adeae14978c08bc6}{\footnotesize \par}

{\footnotesize checkout:~~~~~1beab955418a942ab9953c4865109ff46cbbd691~2010-06-08~10:44:56~UTC}{\footnotesize \par}

{\footnotesize parent:~~~~~~~6edbaf5fa8e4d061c2e04e7fd481e7663b090bd3~2010-06-07~10:45:57~UTC}{\footnotesize \par}

{\footnotesize tags:~~~~~~~~~trunk}{\footnotesize \par}

{\footnotesize UPDATED\_BY\_MERGE~docs/qdj.lyx}{\footnotesize \par}

{\footnotesize UPDATED\_BY\_MERGE~docs/qdj.pdf}{\footnotesize \par}

{\footnotesize MERGED\_WITH~b72e96832e024f235696dcd6c5d0ddcc2cb38238}{\footnotesize \par}
\end{lyxcode}
\caption{\label{fig:Merge-Operation}合并操作}


\end{figure}


如图有二个文档文件已经被更新，而且没有任何需要合并的冲突发生，因为Jim没有动任何文档的文件，Marilyn也没有动任何程序代码文件。

下一步Jim进行了提交，将这个新合并的那些文件添加到了主分支。记住图示\ref{fig:Merge-Operation}的合并只是更新了你检出的代码而没有将其提交到仓库，除非你将它们检入（主仓库）。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize 558~jsonp>~fossil~}\textbf{\footnotesize commit~-m~\textquotedbl{}After~merging~in~changes\textquotedbl{}}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1058~~~~~~~~~23~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~340~bytes~sent,~864~bytes~received}{\footnotesize \par}

{\footnotesize New\_Version:~3d73c03edee33cdc2e1bd8a47de57b7a6b6d880a}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~1737~~~~~~~~~26~~~~~~~~~~0~~~~~~~~~~1}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1104~~~~~~~~~24~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~1101~bytes~sent,~888~bytes~received}{\footnotesize \par}

{\footnotesize 559~jsonp>~}{\footnotesize \par}
\end{lyxcode}
\caption{合并后的提交}


\end{figure}


当我们查看时间线时我们只有一个Leaf，将来可以向这个Leaf提交代码。

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/Simple_Merge/sm_after_merge}

\caption{合并后的时间线}


\end{figure}


还剩余一件事情，就是Marilyn需要在继续工作前进行更新，所以她为了与主仓库同步需要检出最新的代码。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize WhiteBook:jsonp~marilyn\$~}\textbf{\footnotesize fossil~update}{\footnotesize \par}

{\footnotesize Autosync:~~http://Marilyn@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1150~~~~~~~~~25~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~412~~~~~~~~~~7~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~3274~~~~~~~~~31~~~~~~~~~~1~~~~~~~~~~5}{\footnotesize \par}

{\footnotesize Total~network~traffic:~843~bytes~sent,~2709~bytes~received}{\footnotesize \par}

{\footnotesize UPDATE~json-src/qdj\_token.c}{\footnotesize \par}

{\footnotesize UPDATE~json-src/qdj\_util.c}{\footnotesize \par}

{\footnotesize UPDATE~main.c}{\footnotesize \par}
\end{lyxcode}
\caption{Marilyn的更新}


\end{figure}



\subsection{使用的命令}
\begin{itemize}
\item \textbf{fossil merge <fork>} 用来合并一个分叉（通过哈希值来指定分叉）到当前的检出版本
\item \textbf{fossil update <version>} 如果不是使用默认标识的当前版本的检出时，用来更新当前检出到指定的版本（见fossil status）
\end{itemize}

\section{不合并的分叉}

在这例子里，我将演示如何在多用户情况下合并代码的修改而不会产生分叉。例中Marilyn加入了一个BSD许可证的文本内容到所有的代码文件中而Jim正在为代码增加一个帮助函数。例中他们都写了一个标签来说明他们做了什么，但是他们各自独立行事。


\subsection{检入（Checkin）企图}

Marilyn第一个完成并检入了她的修改。Jim编译、测试并检入代码却看到如下信息：

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize 502~jsonp>~}\textbf{\footnotesize make}{\footnotesize \par}

{\footnotesize /usr/bin/gcc~~main.c~-c~-I.~-Ijson-src~-o~obj/main.o}{\footnotesize \par}

{\footnotesize /usr/bin/gcc~~\textbackslash{}}{\footnotesize \par}

{\footnotesize 		obj/main.o\textbackslash{}}{\footnotesize \par}

{\footnotesize 		obj/qdj.o\textbackslash{}}{\footnotesize \par}

{\footnotesize 		obj/qdj\_util.o\textbackslash{}}{\footnotesize \par}

{\footnotesize 		obj/qdj\_token.o\textbackslash{}}{\footnotesize \par}

{\footnotesize 		-o~jsonp}{\footnotesize \par}



{\footnotesize 503~jsonp>~}\textbf{\footnotesize ./jsonp~-v}{\footnotesize \par}

{\footnotesize JSON~Test~Program~Ver:~{[}Jun~~9~2010{]}~{[}10:15:00{]}}{\footnotesize \par}

{\footnotesize SYNTAX:~jsonp~-i~<json~text~file>~{[}-v{]}}{\footnotesize \par}

{\footnotesize -i~<json~text~file>~~~Show~parse~of~JSON}{\footnotesize \par}

{\footnotesize -v~~~~~~~~~~~~~~~~~~~~Show~help}{\footnotesize \par}



{\footnotesize 506~jsonp>~}\textbf{\footnotesize fossil~commit~-m~\textquotedbl{}{[}fed383fa1a{]}~Add~help~to~cmd~line\textquotedbl{}}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1656~~~~~~~~~36~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~647~~~~~~~~~12~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~14039~~~~~~~~~47~~~~~~~~~~4~~~~~~~~~~7}{\footnotesize \par}

{\footnotesize Total~network~traffic:~942~bytes~sent,~4537~bytes~received}{\footnotesize \par}

{\footnotesize fossil:~would~fork.~~\textquotedbl{}update\textquotedbl{}~first~or~use~-f~or~-{}-force.}{\footnotesize \par}
\end{lyxcode}
\caption{Jim的检入企图}


\end{figure}



\subsection{更新}

下一步Jim的操作是执行更新但是没有修改，使用-n参数来显示如果不更改任何文件修改将要发生什么事情。

\begin{figure}[H]
\begin{lyxcode}
507~jsonp>~\textbf{fossil~update~-n}

UPDATE~json-src/qdj.c

UPDATE~json-src/qdj.h

UPDATE~json-src/qdj\_token.c

UPDATE~json-src/qdj\_token.h

UPDATE~json-src/qdj\_util.c

MERGE~main.c
\end{lyxcode}
\caption{更新演练}


\end{figure}


这里显示一些文件将会被更新，如被仓库里的新文件所替换。就是说将会混合Jim修改的和仓库里的文件内容。注意使用参数\textbf{MERGE}的意思是二个文件的合并是分离的。也就是说合并在没有人为介入自动完成。

Jim真正地进行了更新然后提交合并后的文件，从而新建了一个leaf。那么现在我们将Marilyn和Jim的修改合并到了最新的版本里。

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/file_merge/merge}

\caption{合并后的仓库}


\end{figure}



\subsection{使用的命令}
\begin{itemize}
\item \textbf{fossil update -n} 执行一个更新的演练以查看什么文件会被更改。

\begin{itemize}
\item UPDATE 意味着文件将会被仓库的文件替换
\item MERGE 意味着将会将仓库的文件和已检出的文件进行混合
\end{itemize}
\end{itemize}

\section{分支Branch}


\subsection{简介}

我们之前已经讨论过这个，但是分支是故意将仓库里的代码拆分到不同的路径。这个一般发生在我们有维护分支和开发分支的情况下将生产代码进行区别。维护分支已经被使用并会基于体验进行BUG修复；开发分支获取这些修改并合适地修改以增加新功能。

JSON代码语法解析器已经被测试和使用，并已经发布应用。我们想要修改它使得其可以支持UTF-8编码的字符，这样它才是一个可以匹配JSON的标准的程序。当前的版本只能工作在ASCII七位字符下，是一个不标准的JSON库。我们打算将代码拆分为VER\_1.0分支，也就是当前正在使用的代码；另一个是VER\_2.0分支，将会被用来增加UTF-8编码的支持。


\subsection{将仓库添加分支}

在操作前我们需要确认我们检出的代码和主分支trunk一致。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp{]}~jim\%~}\textbf{\footnotesize fossil~status}{\footnotesize \par}

{\footnotesize repository:~/Users/jschimpf/Public/FOSSIL/jsonp.fossil}{\footnotesize \par}

{\footnotesize local-root:~/Users/jschimpf/Public/jsonp/}{\footnotesize \par}

{\footnotesize server-code:~90c80f1a2da7360dae230ccec65ff82fe2eb160d}{\footnotesize \par}

{\footnotesize checkout:~}\textbf{\footnotesize 462156b283}{\footnotesize b694af0b99c9b446b64d3f77436fbb~2010-06-09~14:16:42~UTC}{\footnotesize \par}

{\footnotesize parent:~fbb16491e2ff9f9ca3a98adffa167de1b6903a44~2010-06-09~14:02:28~UTC}{\footnotesize \par}

\textbf{\footnotesize tags:~trunk}{\footnotesize \par}
\end{lyxcode}
\caption{检查代码状态}
\end{figure}


看到它与时间线上最新的leaf是匹配的，我们可以继续对代码进行分支操作了。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp{]}~jim\%~}\textbf{\footnotesize fossil~branch~new~VER\_1.0~trunk~-bgcolor~0xFFC0FF}{\footnotesize \par}

{\footnotesize sh:~gpg:~command~not~found}{\footnotesize \par}

{\footnotesize unable~to~sign~manifest.~~continue~(y/N)?~y}{\footnotesize \par}

{\footnotesize New~branch:~65e1f48633d691a5ea738cd51ccbf9a581dfb3c7}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~2391~~~~~~~~~42~~~~~~~~~~0~~~~~~~~~~1}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1840~~~~~~~~~40~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~1524~bytes~sent,~1272~bytes~received}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp{]}~jim\%~}\textbf{\footnotesize fossil~branch~new~VER\_2.0~trunk~-bgcolor~0xC0F0FF}{\footnotesize \par}

{\footnotesize sh:~gpg:~command~not~found}{\footnotesize \par}

{\footnotesize unable~to~sign~manifest.~~continue~(y/N)?~y}{\footnotesize \par}

{\footnotesize New~branch:~a1737916ec2df696a0f3a7e36edf9ba4370e48a7}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~2437~~~~~~~~~43~~~~~~~~~~0~~~~~~~~~~1}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~1886~~~~~~~~~41~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~1550~bytes~sent,~1271~bytes~received}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp{]}~jim\%~}{\footnotesize \par}
\end{lyxcode}
\caption{分支命令\label{fig:Branch-commands}}
\end{figure}


刚才做了什么？我们使用Fossil的分支命令创建了二个分支VER\_1.0和VER\_2.0并给它们各自指定了一个颜色，我们现在可以查看时间了：

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/Branching/branch}

\caption{分支时间线}
\end{figure}



\subsection{颜色设置}

如你所见二个分支在时间线上有不同的颜色。这是在我们创建分支时由\textbf{-bgcolor}选项增加的。(见图\ref{fig:Branch-commands})。但是我们想让这个颜色可以显示在每个分支以后的检入操作中，要达到这个效果我们必须使用UI命令并为时间线选取特定的Leaf。

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/Branching/color_setup}

\caption{设置分支在时间线上的颜色}


\end{figure}


在章节\textbf{背景颜色}下我选择了\textbf{传递颜色到子对象}，那么将来的检入操作将会使用相同的颜色。


\subsection{检出分支}

现在仓库已经有分支，我们就可以在不同的文件夹内检入不同的分支。我们创建了jsonp1和jsonp2文件夹并执行打开命令将不同的分支释放到这二个文件夹内。

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp1{]}~}\textbf{\footnotesize jim\%~fossil~open~../FOSSIL/jsonp.fossil~VER\_1.0}{\footnotesize \par}

{\footnotesize docs/qdj.lyx}{\footnotesize \par}

{\footnotesize docs/qdj.pdf}{\footnotesize \par}

{\footnotesize json-src/qdj.c}{\footnotesize \par}

{\footnotesize json-src/qdj.h}{\footnotesize \par}

{\footnotesize json-src/qdj\_token.c}{\footnotesize \par}

{\footnotesize json-src/qdj\_token.h}{\footnotesize \par}

{\footnotesize json-src/qdj\_util.c}{\footnotesize \par}

{\footnotesize main.c}{\footnotesize \par}

{\footnotesize makefile}{\footnotesize \par}

{\footnotesize obj/test.txt}{\footnotesize \par}

{\footnotesize test.txt}{\footnotesize \par}

{\footnotesize project-name:~JASONP}{\footnotesize \par}

{\footnotesize repository:~~~/Users/jschimpf/Public/FOSSIL/jsonp.fossil}{\footnotesize \par}

{\footnotesize local-root:~~~/Users/jschimpf/Public/jsonp1/}{\footnotesize \par}

{\footnotesize project-code:~eb6084c8ab115cf2b28a129c7183731002c6143a}{\footnotesize \par}

{\footnotesize server-code:~~90c80f1a2da7360dae230ccec65ff82fe2eb160d}{\footnotesize \par}

{\footnotesize checkout:~~~~~65e1f48633d691a5ea738cd51ccbf9a581dfb3c7~2010-06-13~10:13:55~UTC}{\footnotesize \par}

{\footnotesize parent:~~~~~~~462156b283b694af0b99c9b446b64d3f77436fbb~2010-06-09~14:16:42~UTC}{\footnotesize \par}

{\footnotesize tags:~~~~~~~~~}\textbf{\footnotesize VER\_1.0}{\footnotesize \par}
\end{lyxcode}
\caption{检出VER\_1.0}
\end{figure}


同样的方式检出VER\_2.0

\begin{figure}[H]
\begin{lyxcode}
{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp2{]}~jim\%~}\textbf{\footnotesize fossil~open~../FOSSIL/jsonp.fossil~VER\_2.0}{\footnotesize \par}

{\footnotesize docs/qdj.lyx}{\footnotesize \par}

{\footnotesize docs/qdj.pdf}{\footnotesize \par}

{\footnotesize json-src/qdj.c}{\footnotesize \par}

{\footnotesize json-src/qdj.h}{\footnotesize \par}

{\footnotesize json-src/qdj\_token.c}{\footnotesize \par}

{\footnotesize json-src/qdj\_token.h}{\footnotesize \par}

{\footnotesize json-src/qdj\_util.c}{\footnotesize \par}

{\footnotesize main.c}{\footnotesize \par}

{\footnotesize makefile}{\footnotesize \par}

{\footnotesize obj/test.txt}{\footnotesize \par}

{\footnotesize test.txt}{\footnotesize \par}

{\footnotesize project-name:~JASONP}{\footnotesize \par}

{\footnotesize repository:~~~/Users/jschimpf/Public/FOSSIL/jsonp.fossil}{\footnotesize \par}

{\footnotesize local-root:~~~/Users/jschimpf/Public/jsonp2/}{\footnotesize \par}

{\footnotesize project-code:~eb6084c8ab115cf2b28a129c7183731002c6143a}{\footnotesize \par}

{\footnotesize server-code:~~90c80f1a2da7360dae230ccec65ff82fe2eb160d}{\footnotesize \par}

{\footnotesize checkout:~~~~~a1737916ec2df696a0f3a7e36edf9ba4370e48a7~2010-06-13~10:14:26~UTC}{\footnotesize \par}

{\footnotesize parent:~~~~~~~462156b283b694af0b99c9b446b64d3f77436fbb~2010-06-09~14:16:42~UTC}{\footnotesize \par}

{\footnotesize tags:~~~~~~~~~}\textbf{\footnotesize VER\_2.0}{\footnotesize \par}
\end{lyxcode}
\caption{VER\_2.0检出}
\end{figure}


注意Tags标签，这样我们可以知道我们在那个分支上。


\subsection{修复错误(全部)}

在完成这些工作后，我发现文件main.c有一个关于未使用的变量的警告。我想在二个分支中都修正它。目前二个分支中的文件都是一样的，所以在每个分支修改提交或者覆盖到另外一个再提交是可行的。我新建了一个关于main.c修改和编辑的标签。我把它复制到每一个分支然后分别检入。

\begin{figure}[H]

\begin{lyxcode}
{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp1{]}~jim\%~}\textbf{\footnotesize fossil~commit~-m~\textquotedbl{}{[}2795e6c74d{]}~Fix~unused~variable\textquotedbl{}}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~2116~~~~~~~~~46~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~365~~~~~~~~~~6~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~3601~~~~~~~~~51~~~~~~~~~~5~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~805~bytes~sent,~3464~bytes~received}{\footnotesize \par}

{\footnotesize New\_Version:~3b902585d0e8849399286139d27676c5a349de7b}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~3034~~~~~~~~~50~~~~~~~~~~0~~~~~~~~~~2}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~2208~~~~~~~~~48~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~1848~bytes~sent,~1444~bytes~received}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp1{]}~jim\%~}\textbf{\footnotesize cd~..}{\footnotesize \par}

{\footnotesize {[}Pandora-2:/Users/jschimpf/Public{]}~jim\%~}\textbf{\footnotesize cd~jsonp2}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp2{]}~jim\%~}\textbf{\footnotesize cp~../jsonp1/main.c~.}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp2{]}~jim\%~}\textbf{\footnotesize fossil~status}{\footnotesize \par}

{\footnotesize repository:~~~/Users/jschimpf/Public/FOSSIL/jsonp.fossil}{\footnotesize \par}

{\footnotesize local-root:~~~/Users/jschimpf/Public/jsonp2/}{\footnotesize \par}

{\footnotesize server-code:~~90c80f1a2da7360dae230ccec65ff82fe2eb160d}{\footnotesize \par}

{\footnotesize checkout:~~~~~a1737916ec2df696a0f3a7e36edf9ba4370e48a7~2010-06-13~10:14:26~UTC}{\footnotesize \par}

{\footnotesize parent:~~~~~~~462156b283b694af0b99c9b446b64d3f77436fbb~2010-06-09~14:16:42~UTC}{\footnotesize \par}

{\footnotesize tags:~~~~~~~~~VER\_2.0}{\footnotesize \par}

{\footnotesize EDITED~~~~~main.c}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp2{]}~jim\%~}\textbf{\footnotesize fossil~commit~-m~\textquotedbl{}{[}2795e6c74d{]}~Fix~unused~variable\textquotedbl{}}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~130~~~~~~~~~~1~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~2392~~~~~~~~~52~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~~318~~~~~~~~~~5~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~3320~~~~~~~~~56~~~~~~~~~~4~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~781~bytes~sent,~3508~bytes~received}{\footnotesize \par}

{\footnotesize New\_Version:~762a31854d708080678598c8d4ce28465cbee8c5}{\footnotesize \par}

{\footnotesize Autosync:~~http://jim@pandora.dyn-o-saur.com:8080/cgi-bin/jsonp.cgi}{\footnotesize \par}

{\footnotesize{}~~~~~~~~~~~~~~~~Bytes~~~~~~Cards~~Artifacts~~~~~Deltas}{\footnotesize \par}

{\footnotesize Send:~~~~~~~~~~~~3253~~~~~~~~~55~~~~~~~~~~0~~~~~~~~~~2}{\footnotesize \par}

{\footnotesize Received:~~~~~~~~2438~~~~~~~~~53~~~~~~~~~~0~~~~~~~~~~0}{\footnotesize \par}

{\footnotesize Total~network~traffic:~1972~bytes~sent,~1573~bytes~received}{\footnotesize \par}

{\footnotesize {[}Pandora-2:jschimpf/Public/jsonp2{]}~jim\%~}{\footnotesize \par}
\end{lyxcode}


\caption{修复二个分支的警告}


\end{figure}


现在的时间线如下所示：

\begin{figure}[H]
\includegraphics[width=6in, scale=0.6]{Images/Advanced/Branching/current_state}
\caption{修正二个分支}
\end{figure}


\subsection{使用的命令}
\begin{itemize}
\item \textbf{fossil branch }用来生成一个仓库的分支。这个命令有给分支指派颜色的参数选项。
\end{itemize}
